package com.cskaoyan.javase.array._0introduction;

/**
 * 数组的引入/数组的基本特点
 * 引例：
 * 假设一个班上有80个人，现在需要统计，某一门课程的平均成绩，是否需要定义80个变量？
 * 编写一个程序，需要储存12个月份的天数，是否要定义12个变量呢？
 * 编写一个扑克程序，需要储存54张扑克的信息，是否要定义54个变量？
 *
 * 如果程序需要储存上成千上万的数据，程序员是不是也要逐一定义成千上万个变量呢？
 *
 * 很明显，如果程序需要多少数据，就要定义多少个变量，也太过于麻烦了
 * 并且多个变量单独存在没有任何关联，也不方便管理和维护。
 *
 * 程序的扩展性和可维护性是程序非常重要，甚至是最重要的特点。
 *
 * 这样就好比，去超市购物，谁有人会把东西一个一个带回家。
 * 购物需要"袋子"装东西，Java变量也需要一个容器来存放它们。
 *
 * Java的容器有很多，最基本的容器就是数组（Array），定义一个数组，就可以存储很多数据。
 *
 * 数组的定义：
 * 数组是存储多个，具有相同数据类型的数据元素的有序容器（集合）。
 *
 * 定义中的重点是：
 *      1.数组是一个容器，定义一个数组，就能够存储多个数据元素。
 *      2.这些数据元素的数据类型，必须一致（重要特点）
 *      3.这些数据是有序的：
 *          数组中的每个存储单元，都有唯一编号(下标)，该编号，从左向右，从0开始编号，最大值是数组长度-1
 *          这种编号，专业的术语称之为下标或者索引（index）
 *
 * 补充：
 *      1.数组也是一种数据类型，是一种引用数据类型
 *          定义数组，就是定义一个引用数据类型变量
 *          只不过这个引用数据类型变量是一个容器，可以装别的元素（变量）
 *
 *      2.数组里面，可以存储基本数据类型，也可以存储引用数据类型，但是一个数组里面只能存储同一种数据类型。
 *
 *
 * 数组的优缺点：
 *      数组是线性表的一种典型物理实现，它是用一段连续的内存空间，来存储具有相同数据类型数据的容器
 * 数组的缺点：
 *      1.作为一个容器，它只能存储相同数据类型的元素。
 *      2.数组必须占用一片连续的内存空间，这说明数组对内存空间使用的要求很高
 *          JVM在创建数组时，必须事先为数组规划好合理的空间
 *          -->
 *          一个数组只要在内存中被创建出来，那么它的存储空间就是固定的
 *          数组的长度一旦创建固定，是不可能再改变了！！
 *          数组的使用是很不方便的，实际开发中很少直接使用数组。
 *          -->
 *          如果预先规划的数组长度过长，会导致内存空间的浪费
 *          如果过短，那就更不行了。
 *
 *
 * 数组有以上缺点，那么又有什么优点呢？
 * 数组的优点是非常鲜明的，数组支持随机访问。数组中元素的存储和访问，效率都很高。
 *
 * 数组的优点正是数组的缺点带来的：
 * 数组的随机访问原理是：
 *      根据数组的首地址和下标，通过寻址公式直接计算出对应的内存地址，最终找出数据。
 * 所以：
 *      1.数组存储单元必须连续才能进行连续计算，寻址公式才有意义。
 *      2.数组的每个存储单元都必须一样，否则也无法计算。
 * 结论：
 *      为了实现随机访问这个优点，数组必须连续，必须长度不可变，必须只能存储相同的数据类型。
 *
 * 扩展：
 *      1.数组的优缺点很鲜明，而且由于数组的长度不可变，所以数组在实际开发中很少直接被使用。
 *      而是采取一种更加灵活的方式去间接使用数组。
 *      比如Java中的集合（高级容器,是日常开发中最常用的容器）中ArrayList
 *      ArrayList的底层实现仍然是一个数组,但是这个数组可以自动扩容
 *      而且也有下标,也有随机访问.
 *
 *      实际开发中ArrayList是最常用的容器,它其实就是数组.
 *
 *      2.数组的下标为什么非要从0开始?
 *      为什么计算机中存储整数要用补码的形式?不存储原码?
 *      IEE754标准中存在移码的概念,为什么呢?
 *
 *      方便计算机,而不方便人类.
 *
 * @since 10:09
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {

    }
}
